Преимущество хранения интерфейсов в отдельной библиотеке классов состоит в том, что она фактически отделяет реализацию и использование библиотек классов. Если интерфейсы с конкретными классами реализации, то у вас есть
ImplementingClasses.dll <--- ClientClasses.dll </p>
Если вы поместите интерфейсы в отдельную сборку, это будет выглядеть примерно так:
ImplementingClasses.dll ---> Interfaces.dll <--- ClientClasses.dll </p>
Обратите внимание, как это устраняет связь между вашим клиентским кодом и реализацией - это позволит вашему общему приложению использовать подход, основанный на конфигурации, для поиска подходящих классов реализации.