Depends on what you mean by dynamic surfaces. If you want to destroy a surface and recreate it then you can do this just by using pointers to surfaces and creating them dynamically via new/delete, etc.
However this will be slow. The best route is to reuse surfaces that are already created at a size sufficient to hold the image data you want on it. You can then just clear the surface with a blit to black and load a new image over it. Or just load a new image over it.