No object reference on instantiate return?

I return a Gameobject when making a New Tetromino from the GameController but It is returning a empty object. The Log in the Spawner code is showing the right object, but the log in the gamecontroller is just showing Object.

Spawner code:

public class Spawner : MonoBehaviour
{
public GameObject Tetrominoes;
private List instantiatedTetrominioes = new List();
private int index = 0;
// Start is called before the first frame update
void Start()
{
NewTetromino();
}

public GameObject NewTetromino()
{
   GameObject newObject =  Instantiate(Tetrominoes[Random.Range(0, Tetrominoes.Length)], transform.position, Quaternion.identity) as GameObject;
    instantiatedTetrominioes.Add(newObject);
    index++;
    Debug.Log(instantiatedTetrominioes[index - 1]);
    return instantiatedTetrominioes[index - 1];
}

}

Code in GameController:

void OnGameStarted()
{
    currentBlock = spawner.NewTetromino();
    Debug.Log("current: " + currentBlock);
}

So at first you should check, if there is any object inside your Array

 public GameObject NewTetromino()
 {
if(Tetrominoes.Length > 0){
    GameObject newObject =  Instantiate(Tetrominoes[Random.Range(0, Tetrominoes.Length)], transform.position, Quaternion.identity) as GameObject;
     instantiatedTetrominioes.Add(newObject);
     index++;
     Debug.Log(instantiatedTetrominioes[index - 1]);
     return instantiatedTetrominioes[index - 1];
} else{
return null 
}
 }

Also there a little bug at your Random.Range, because, as far as I remember, Random.Range includes also the upper bounds. So it should be Tetrominoes.Length -1 because if not, you can get some errors from that.

Also you dont need that index-thing,this also can cause some errors. Just do it in that way:

 public GameObject NewTetromino()
  {
 if(Tetrominoes.Length > 0){
     GameObject newObject =  Instantiate(Tetrominoes[Random.Range(0, Tetrominoes.Length)], transform.position, Quaternion.identity) as GameObject;
      instantiatedTetrominioes.Add(newObject);
float count = instantiatedTetrominioes.Count -1;
      Debug.Log(instantiatedTetrominioes[count]);
      return instantiatedTetrominioes[count];
 } else{
 return null 
 }
  }

And last thing, just for checking later if anything works fine or not, just give back your Gameobject via out and make the function a boolean.

public bool NewTetromino(out Gameobject newObject)
   {
  if(Tetrominoes.Length > 0){
      newObject =  Instantiate(Tetrominoes[Random.Range(0, Tetrominoes.Length)], transform.position, Quaternion.identity) as GameObject;
       instantiatedTetrominioes.Add(newObject);
 float count = instantiatedTetrominioes.Count -1;
       Debug.Log(instantiatedTetrominioes[count]);
       return true;
  } else{
  return false; 
  }
   }

So now, if your functions return false, your array isnt filled with anything and you can check easily at your Gamecontroller:

 void OnGameStarted()
 {
    if(spawner.NewTetromino(out currentBlock))
       Debug.Log("current: " + currentBlock);
     }else{
       Debug.Log("No items in Array");
    }
 }