Вот еще одно решение pre-.NET 3.5 для любого IList, содержимое которого может быть неявным.
public IList<B> ConvertIList<D, B>(IList<D> list) where D : B
{
List<B> newList = new List<B>();
foreach (D item in list)
{
newList.Add(item);
}
return newList;
}
(На примере Zooba)