Para o que vale, aqui está um exemplo de como a herança de uma classe genérica é usada no compilador Roslyn da Microsoft e sem alterar o nome da classe. (Fiquei tão confuso com isso que acabei aqui na minha pesquisa para ver se isso era realmente possível.)
No projeto CodeAnalysis, você pode encontrar esta definição:
/// <summary>
/// Common base class for C# and VB PE module builder.
/// </summary>
internal abstract class PEModuleBuilder<TCompilation, TSourceModuleSymbol, TAssemblySymbol, TTypeSymbol, TNamedTypeSymbol, TMethodSymbol, TSyntaxNode, TEmbeddedTypesManager, TModuleCompilationState> : CommonPEModuleBuilder, ITokenDeferral
where TCompilation : Compilation
where TSourceModuleSymbol : class, IModuleSymbol
where TAssemblySymbol : class, IAssemblySymbol
where TTypeSymbol : class
where TNamedTypeSymbol : class, TTypeSymbol, Cci.INamespaceTypeDefinition
where TMethodSymbol : class, Cci.IMethodDefinition
where TSyntaxNode : SyntaxNode
where TEmbeddedTypesManager : CommonEmbeddedTypesManager
where TModuleCompilationState : ModuleCompilationState<TNamedTypeSymbol, TMethodSymbol>
{
...
}
Então, no projeto CSharpCodeanalysis, há esta definição:
internal abstract class PEModuleBuilder : PEModuleBuilder<CSharpCompilation, SourceModuleSymbol, AssemblySymbol, TypeSymbol, NamedTypeSymbol, MethodSymbol, SyntaxNode, NoPia.EmbeddedTypesManager, ModuleCompilationState>
{
...
}
Essa classe PEModuleBuilder não genérica é usada extensivamente no projeto CSharpCodeanalysis e várias classes nesse projeto são herdadas, direta ou indiretamente.
E então, no projeto BasicCodeanalysis, há esta definição:
Partial Friend MustInherit Class PEModuleBuilder
Inherits PEModuleBuilder(Of VisualBasicCompilation, SourceModuleSymbol, AssemblySymbol, TypeSymbol, NamedTypeSymbol, MethodSymbol, SyntaxNode, NoPia.EmbeddedTypesManager, ModuleCompilationState)
Como podemos (espero) supor que Roslyn foi escrita por pessoas com amplo conhecimento de C # e como deve ser usada, estou pensando que essa é uma recomendação da técnica.