Я столкнулся с той же ситуацией: я думаю, что у вас есть , чтобы по своей природе использовать атрибут [KnownType], чтобы сериализатор знал, какую реализацию ждать.
Ключевым моментом является то, что сериализатор получает несколько байтов с небольшими метаданными относительно того, как их читать (в основном, имя типа). Вот почему необходимо знать, какой тип эти байты должны представлять, и «знать» этот тип.
Без этой информации у сериализатора нет абсолютно никакой возможности выяснить, где он должен найти несколько полей, реализующих функциональность вашего интерфейса.
Однако вы можете добавить новые KnownTypes во время выполнения (т.е. динамически), используя непосредственно DataContractSerializer
Много информации по этой теме здесь