PESDK support dynamic updating of your view port and you can even write to multiple view ports during a pass through the render loop. If you need more power, then PESDK supports Swap Chains as well. A good example of using swap chains is when making some type of game editor. I first added swap chains support a few years ago when I started working on a tile editor (I need to finish this). I think I had like 3-4 swap chains active on what I had working of the tile editor. So, swap chain support is in and it is very handy for making tools and other special effects where you need to render to multiple windows.

As a result of adding swap chains I created a class called TPEList to keep track of the chain list. You you can think of it has an extension of Delphi's TList object. TPEList allows you to either add a new pointer or dynamically allocate memory and keep track of it. You reference the pointers in index order like TList. What is nice is that if call TPEList.AddItem(MyPointer, @MyIndexRefVar) you pass a pointer to an integer variable it will write the index to this variable and if the list changes, the index reference to the pointer will automatically be updated. So, if for example you delete a pointer from the list, all the pointers that has reference, the reference variable will be automatically updated to reflect the new value.

I recently added support for 2D positional audio (it will be available in the next build). You can start a sample playing and using PE_Audio_2DPanning/Volume/Frequency routines you are able to dynamically update these values in real-time. PE_Audio_2DFrequency allows you to specify a Doppler shift value. PE_Audio_2DVolume/Frequency both supports a maximum distance to operate over.

PESDK also has plugin support via standard DLLs. Make a dll project and include the pePlugIn unit. You plugins are extended from the the TPEPlugIn class. You simply have add this block of code to the bottom of your plugin dll unit to auto register the PlugInProc when the dll is loaded
Code:
// DLL PlugInProc
procedure PlugInProc(aOperation: TPlugInOperation; var aPlugIn; const aFileName: PChar);
begin
  case aOperation of
    pioCreate : TPEPlugIn(aPlugIn) := TPlugIn.Create(PlugInProc, aFileName);
    pioDestroy: PE_FreeNilClass(aPlugIn);
  end;
end;

initialization
  // Register DLL PlugInProc
  PE_SetPlugInProc(PlugInProc);
Next create an instance of TPEPlugInManager and after you call TPEPlugInManager.Load('your dll path'), a list of loaded plugins will be in the plugins property. Updates, add-on and other dynamic features are possible with PESDK.

If you just want to dynamically bind to a routine in a dll, you can do this with the TPEDLL class. just call TPEDLL.Bind(MyProc, 'myproc', 'MyDll.dll'). After this call you can call MyProc(). It will keep track of loaded DLLs. You can load/unload them by name.