Trouvé ! J'appelais GetCollection() depuis une autre méthode générique, comme ceci :
public T Save<T>(T item) where T : class, IRepoData, new()
{
GetCollection<T>().Save(item);
}
Cela a amené GetCollection à voir T comme l'interface au lieu de la classe d'instance réelle. GetCollection fonctionne correctement partout ailleurs.
Pour toute autre personne ayant ce problème, j'ai simplement utilisé une requête de bas niveau comme celle-ci à la place... Collection.FindOneAs<T>(Query.EQ("Id", itemID.ToString()));