Несмотря на наличие строгих принципов пакетирования и метрик, отражающих эффективность разделения классов по пакетам, на этот вопрос нет однозначного ответа. Большинство разработчиков решают эту задачу так:
Интерфейс выделяется в отдельную сборку если он достаточно общий (не связан по смыслу с другими классами проекта) или если предполагается наличие нескольких реализаций (возможно сторонних) этого интерфейса.
Интерфейс располагается в одной сборке с реализацией когда этот интерфейс служит лишь для уменьшения связанности классов внутри проекта и предполагает наличие только одной реализации.