Diseño de herencia usando Interface + clase abstracta. ¿Buena práctica?

No estoy realmente seguro de cómo titular esta pregunta, pero básicamente tengo una interfaz como esta:

public interface IFoo
{
    string ToCMD();
}

un par de clases de absract que implementan IFoo como:

public abstract class Foo : IFoo
{
   public abstract string ToCMD();
}

public abstract class Bar : IFoo
{
    public abstract string ToCMD();
}

luego clases que heredan Foo y Bar:

public class FooClass1 : Foo
{
    public override string ToCMD()
    {return "Test";}
} ///there are about 10 foo classes.

public class BarClass : Bar
{
    public override string ToCMD()
    {return "BarClass";}
} ///about the same for bar classes.

Estoy haciendo esto para que cuando tenga mi lista personalizada como:

public class Store<T> : List<T>  where T : IFoo {}

Entonces puedo restringir los tipos que van en él, pero al tener la interfaz, todavía tomará cualquier tipo de IFoo.

Algo como:

Store<Foo> store = new Store<Foo>(); //Only Foo types will work.
store.Add(new FooClass1()); //Will compile.

Store<IFoo> store = new Store<IFoo>(); //All IFoo types will work.
store.Add(new FooClass1()); //Will compile.
store.Add(new BarClass()); //Will compile.

Mi pregunta es: ¿Es esta una forma correcta de hacer esto? ¿O hay un mejor camino?

EDITAR: Imagen->

Respuestas a la pregunta(5)

Su respuesta a la pregunta