A List<>é simplesmente uma matriz de redimensionamento automático, de itens de um determinado tipo, com algumas funções auxiliares (por exemplo: classificar). São apenas os dados, e é provável que você os use para executar operações em um conjunto de objetos em seu modelo.
A BindingList<>é um wrapper em torno de uma lista digitada ou uma coleção, que implementa a IBindingListinterface. Esta é uma das interfaces padrão que suportam ligação de dados bidirecional. Ele funciona implementando o ListChangedevento, que é gerado quando você adiciona, remove ou define itens. Os controles vinculados ouvem esse evento para saber quando atualizar sua exibição.
Quando você define um DataSource de BindingSource como a List<>, ele cria internamente um BindingList<>para agrupar sua lista. Você pode querer pré-empacotar sua lista com um BindingList<>você mesmo se quiser acessá-la fora do BindingSource, mas caso contrário, é a mesma coisa. Você também pode herdar de BindingList<>para implementar um comportamento especial ao alterar itens.
IEditableObjecté manipulado pelo BindingSource. Ele chamará BeginEdit em qualquer objeto de implementação quando você alterar os dados em qualquer controle vinculado. Você pode então chamar EndEdit / CancelEdit no BindingSource e ele irá repassá-lo ao seu objeto. Mover para uma linha diferente também chamará EndEdit.