Alla fine, ottengo che l'arraylist è riempito sempre con lo stesso valore.....
Non può essere lo stesso valore visto che l'arrayList è composto da matrici di stringhe.

e non capisco quale è il problema: se nella stampa o nel riempimento.
Mi sembra nella stampa, anche se non capisco cosa vuoi leggere

codice:
for (int i = 0; i < tot.Count; i++) { 
        string[] value = tot[i] as string[]; 
         Console.WriteLine(value[0]); }
Mi sembra di vedere, con il codice che hai scritto, che leggi solo il primo valore di ogni matrice. (value[0] ). A mio parere il modo corretto di vedere tutti gli elemti delle matrici potrebbe essere:

codice:
for (int i = 0; i < tot.Count; i++)
                {
                    string[] value = tot[i] as string[];
                    for (int c = 0; c < value.GetUpperBound (0); c++)
                    {
                        Console.WriteLine(value[c]);
                    }                  
                }