FooCollection - с Foo это не очевидно, поскольку Foo не имеет смысла, поэтому его сложно осмыслить. Попробуйте это с «реальным» именем класса / интерфейса, и это будет иметь больше смысла - например,
public class ErrorHandlerCollection : List<IErrorHandler>
{
public void PublishErrors(){//...}
}
Это имеет смысл, потому что ErrorHandlerCollection представляет собой набор обработчиков ошибок. Все, что реализует IErrorHandler, является обработчиком ошибок, поэтому все, что в ErrorHandlerCollection, будет обработчиком ошибок.