Чистого подхода к этому нет ни в управляемом, ни в собственном коде.Лучшее, что вы можете сделать, это объявить тип интерфейса, который пытается охватить все возможные версии, а затем написать конкретные классы-оболочки для каждой отдельной версии API.Если есть хотя бы какие-то общие функциональные возможности, то вы можете добавить их в базовый класс.
Также примечательно, что вы не можете просто позволить пользователю выбрать DLL, вы должны связать DLL с конкретным экземпляром класса-оболочки.
Создание такой гибкости в вашей программе, очевидно, очень дорого.