perdonami ma non posso controllare tutto il codice, non ne avrei il tempo...
Il problema è che devi saperlo tu come di che tipo è Faces, se si tratta di un array (tipo miaclasse[]), allora è un tipo IList<miaclasse>, se invece quello che passi è un miaclasse, allora T e basta, in fine se quello che passi è un T, ma con indicizzatori (non è un array...) allora non lo puoi usare con generics direttamente, ma devi creare un interface :

codice:
interface IIndexable<T>
{
     T this[string index] {get; set;}
}
dalla quale fai ereditare tua classe (il tipo di Faces).
a questo punto :
codice:
public bool Close<T,A>(T faces, Vector3 L, float closed) where T : IIndexable<A>
{
     .....
     A NP = faces[0];
}
....
//per chiamarlo :
Close<Face<string>, string>(new Face<string>(), myVector3, myFloat);
questo nel caso il valore restituito dall'indicizzatore sia di tipo string (A), diversamente per A usi il tipo che restituisce.

ora vista così non è proprio il massimo, bisognerebbe capire che tipo restituisce l'indexer, se è dello stesso tipo della classe (T) allora hai sbagliato a fare gli indicizzatori, sarebbe stato meglio usare un array di tipo T (T senza indici).