Uma vez tive um problema para se criar uma instancia dinamicamente de um tipo genérico o problema e que este tipo ele e informado via parâmetro dentro de um laço ou mesmo em uma assinatura de método que não pode utilizar o genérico. uma implementação pratica disso e a seguinte:
Suponhamos que temos uma classe generica repository com o método Save.
 1: public class Repository<T> where TSource : new()
 2: {
 3:     public void Save(T entity)
 4:     {
 5:     }
 6: }
Então para se utilizar o método Salvar(), por exemplo um objeto pessoa faz o seguinte:
 1: new Repository<Pessoa>().Save(pessoa)
Mas levando para o seguinte cenário, quando este método fosse consumido por uma outra classe onde a entidade de origem não tem seu tipo definido como a classe abaixo:
 1: public class Service
 2: {
 3:     public void Save(Object entity)
 4:     {       new Repository<???
 5:     }
 6: }

Uma forma para se contornar isso e instanciar o objeto dinamicamente:

 1: public class Service
 2: {
 3:     public void Save(Object entity)
 4:     {
 5:       Type type = entity.GetType()
 6:       var repository = Activator.CreateInstance(typeof (Repository<>).MakeGenericType(type));
 8:
 9:       repository
 10:             .GetMethod("Save", new Type[] { type})
 11:             .Invoke(repository, new object[] { entity});
 12:     }
 13: }
Assim com um único serviço pode utilizar varios objetos.