Dann müsstest du die Assembly des gewünschten Providers von Hand laden und die jeweiligen Klassen suchen gehen, die Namen kennst du ja nicht.
Um eine Assembly zu laden brauchst du entweder den Dateinamen oder den entsprechenden String mit dem die Assembly im
GAC gefunden werden kann. Sprich der Benutzer müsste in einer Config-Datei eins von beiden eintragen oder du stellst die
GAC Strings zur Verfügung und der Nutzer hakt nur an.
Die eigentliche Implementierung wäre dann trotzdem mittels einer Factory, die als Singleton implementiert ist. Die würde dann im Konstruktor die Config-Datei lesen, die entsprechende Assembly laden und die Typnamen raussuchen.