ИМХО, вы должны стараться много использовать интерфейсы. Проще ошибиться, не используя интерфейс, чем используя его.
Мой главный аргумент в этом заключается в том, что интерфейсы помогают вам сделать более тестируемый код. Если у конструктора класса или метода есть конкретный класс в качестве параметра, это сложнее (особенно в C #, где нет бесплатные фальшивые фреймворки позволяют имитировать не виртуальные методы конкретных классов, чтобы вы могли делать свои тесты настоящими юнит-тестами.
Я полагаю, что если у вас есть DTO-подобный объект, то использование интерфейса излишне, может быть, даже издеваться над ним может быть даже сложнее, чем создавать его.
Если вы не тестируете, используете внедрение зависимостей, инверсию управления; и ожидайте, что никогда не сделаете ничего из этого (пожалуйста, избегайте этого, хе-хе), тогда я бы предложил использовать интерфейсы всякий раз, когда вам действительно понадобятся разные реализации, или вы хотите ограничить видимость одного класса над другим.