Если вы не хотите, чтобы в вашем приложении были ссылки на отдельных провайдеров, вам нужно будет справиться с этим немного по-другому.
Есть два основных варианта, которые я вижу - первый (и самый простой) - использовать инфраструктуру внедрения зависимостей, чтобы просто подключить соответствующего поставщика во время выполнения. Это просто, чисто и хорошо работает.
Вы могли бы сделать это самостоятельно без этого, хотя. Просто создайте базовый класс общего назначения, который предоставляет интерфейс, и для каждого поставщика создайте отдельную сборку (чтобы ссылки были разделены), которая реализует этот базовый класс. Затем вы можете использовать Activator.CreateInstance для создания экземпляра соответствующего типа во время выполнения.