Один из способов сделать это - создать интерфейс, который все библиотеки имеют возможность сопоставления, а затем реализовать класс-оболочку для каждой, которая реализует интерфейс с использованием этой конкретной библиотеки.Каждый класс-обертка должен находиться в отдельной сборке, чтобы избежать зависимости от библиотеки класса-обертки.
Затем, когда вы выбираете реализацию во время выполнения, вы делаете это путем создания экземпляра класса-обертки посредством отражения.