Как из списка базового класса сделать список наследуемового класса?
*Какая-то беда с дизайном.*
Кастовать вниз по иерархии (downcast) напрямую объекты A в B нельзя, потому что A - это не B. Потому что B содержит какое-то дополнительное состояние (b), которого нет в A и компилятору неизвестно, каким оно должно быть в текущем виде (A конструировался иначе, чем B и как получить валидный B из A - известно лишь программисту). 
Об этом вам пытается рассказать рантайм (Invalid Cast).
Что касается методов, которые не приводят к желаемому:Enumerable.OfType<T>() - фильтрует по типу и законно возвращает пустой список (у вас список A, там действительно нет B)Enumerable.Cast<T>() - последовательно делает каст, который невозможен.
Можно попытаться скопировать объекты в новый список:listA.Select(x => new B{ a = x.a }).ToList();
Но это прокатит лишь в том случае, если мы сможем достать из A необходимые данные для конструирования объекта B. Важно понимать, что это будут именно ДРУГИЕ объекты. Если A некопируем по своей природе, то этот фокус не пройдет.
С архитектурой явная проблема. По хорошему в таком случае надо работать с интерфейсами по возможности и использовать ковариантность/контравариантность.