Question: It is fairly easy to create ABAP program objects using the built-in statements. But what about dictionary objects? There are a lot of function groups related to DDIC, but which ones to use? Or classes perhaps?

Answer: 
Check the function modules RPY\_\* - they are rather complete and reliable (and RFC-enabled :-)).
One class you can use is CL\_REBF\_DDIC\_TABL. Use the static method PUT\_COMPLETE. For a function module have a look at DD\_CREATE\_TABLE but I've never used this before.