Именно так я структурировал дизайн для приложения n-уровня электронной коммерции, которое я разработал.
Существует две общие библиотеки - одна для DTO и другая для интерфейсов.
Затем клиент и сервер включили эти библиотеки, и сервисные прокси были сгенерированы с использованием общих типов.
Основным преимуществом здесь является простота компиляции - вам не нужно заново создавать прокси, когда вы меняете интерфейс, клиент и сервер обновляются автоматически.
У меня также было служебное приложение, которое содержало все необходимое для работы вспомогательного типа.
РЕДАКТИРОВАТЬ: Извините, просто перечитайте ваш вопрос. В моем случае у меня было несколько библиотек интерфейсов - одна для библиотеки рабочего процесса (с составными интерфейсами), а другая для служб (вещь, объединенная в операции рабочего процесса)
Так что в моем случае имело смысл держать их отдельно.
Если у вас есть только один набор интерфейсов, и все эти интерфейсы используют ваши DTO, нет причин разделять их на две библиотеки - одной будет достаточно. Тем не менее, подумайте, если в будущем вам может понадобиться разделить ваш DTO между несколькими библиотеками интерфейсов, в этом случае лучше отделить DTO от интерфейсов с самого начала.