Teoretycznie się nie da:
http://delphi.about.com/library/weekly/aa020805a.htm
Paczki (Package) rozwiązują ten problem. Praktycznie się da (sam tak zrobiłem cały program), ale nie wolno ci używać pewnych rzeczy.
Dlaczego? Pomimo, że program i DLLka mieszczą się w tej samej pamięci mają osobne między innymi obiekty Application oraz Screen. Aby działało, przy pierwszym wywołaniu funkcji z DLL musisz przekazać te obiekty do DLL i podmienić.
Ale nie rozwiązuje to problemu, bo np.: takich obiektów jak FontManage przekazać się w ogóle nie da, bo unit'y przechowują je jako prywatne - a DLL oraz aplikacja nawet ten sam unit wgrywają osobno, przez co istnieją dwa zupełnie różne zbiory obiektów (poczytaj o tym przy paczkach, bo też tam jest to kluczowe zadanie).
Ostatecznie i tak próba zmiany czcionki w oknie DLL przez aplikację kończy się Access Violation, bo po podmianie czcionki, jeśli stara jest niepotrzebna - jest niszczona. Aplikacja usuwa starą ze swojego FontManager'a (a nie ma jej tam bo jest w DLLkowym FontManager'ze), więc wywala Access Violation.
Możesz użyć Package (trudne) albo innej metody (na około) - tworzyć MDI child jako puste okno (w ramach aplikacji) i wywołaniem funkcji z DLL tworzyć zwykłe okno z DLL i jako parent ustawiać jako uchwyt MDIChild.