Jest na to troszkę pokrętne rozwiązanie.
Możesz dll załadować do zasobów, jako "embedded resource". Następnie stworzyć interface/klasę bazową, która "opakuje" twoją funkcjonalność. Użyć fabryki klas, aby "po cichu" stworzyć potrzebną ci klasę (klasy), które będą implementowały interface/dziedziczyły po klasie bazowej.
Dzięki temu ominiesz wymóg posiadania dll w katalogu na starcie aplikacji (.NET nie będzie jej szukał). Zacznie to robić dopiero wczytując assembly, gdzie będą twoje klasy. One już mogą mieć referencje do dowolnych bibliotek.
Te klasy wpakowane w dll + potrzebne ci biblioteki wyciągasz z zasobów, zapisujesz na dysk, wczytujesz assembly z dysku i instancjonujesz klasy. Po zakończeniu działania programu, czyścisz po sobie dysk.
Zadziała, ale komplikuje całość dość mocno. Inaczej będzie ciężko wkompilować bibliotekę niezarządzaną do kodu zarządzanego - po prostu trzeba oszukać lnikera i nie mówić mu, że to co wkompilowujesz to kod, tak aby nie brał się za jego walidację i czytanie.