Czytałem ze trzy razy to co napisałeś i wciąż nie do końca wiem o co Ci chodzi. Odniosę się tylko do Twoich dwóch pierwszych zdań.
string[] result = (string[])((ArrayList)al[0]).ToArray(typeof(string));
Wskazówka z mojej strony. ArrayList się już nie używa (chyba, że z jakiegoś dziwnego powodu musiałbyś mieć kolekcję zawierającą różne typy danych). Zamiast tego powinieneś korzystać z typów generycznych. W Twoim przykładzie zamiast ArrayListy, która przechowuje ArrayListy przechowujące stringi możesz użyć czegoś takiego:
List> list = new List>();
Uzyskasz dokładnie to co potrzebujesz i nie będziesz musiał wykonywać niepotrzebnych rzutowań. No ale jak coś to kod z ArrayListą też zadziała.