Если вы хотите загружать динамически, то шаблонная магия штука неподходящая. При этом понадобится объединение пространств имен, что в итоге потребует в динамически подключаемых библиотеках давать уникальные имена среди всех модулей.
Я у себя не стал отказываться от наследования, ибо шаблонная магия даже если после кучи извращений и чего-нить даст, то здесь потеря времени разработки, высокая сложность кода.
Не знаю что конкретно вы хотите. Так что в общем попытаюсь рассказать свой подход. Реализовал элементарный механизм. Есть базовый интерфейс, пустой. От него наследуются все остальные. Динамическая библиотека реализует 4 обязательных метода CreateInstance, DestroyInstance — для создание и удаления объектов и CreateEnumerator, DestroyEnumerator — для создания перечисления доступных объектов внутри библиотеки. Сделал простенький менеджер библиотек, фабрику и объект по типу shared_ptr, только с завязкой на библиотеку. В итоге используется простой код
Instance<IInterface> obj = mgr->CreateInstance<IInterface>("identificator");
CreateInstance использует dynamic_cast для приведения к нужному, в случае ошибки кидает исключение.