Firstly, about D-Bus libraries: you talk about dbus-glib in several places, but the functions you are talking about are not part of dbus-glib, but libdbus. If you are still trying to find a better way to use D-Bus, I suggest you forget about all of these: libdbus is very low-level (the documentation even starts with "If you use this low-level API directly, signing up for some pain"), and dbus-glib is deprecated . The best D-Bus API currently is GDBus, which is part of the GLib GIO : it is a much better developed API than either of the other two, well tested and supported.
Now, regarding the actual question, the documentation for dbus_message_append_args() says this quite clearly:
To add basic types of variable length or any more complex value, you should use an iterator, not this function.
In other words, you should use dbus_message_iter_open_container() to prepare the iterator until it points somewhere where you can use dbus_message_iter_append_basic() . Note that in your example, the dictionary is a container, the dictionary entry is a container, and the option is a container ... In other words, it is quite complex pretty quickly. If you really want to do this, take a look, for example. Connman for examples.
As I mentioned, a sensible route is GDBus. There, creating even more complex signatures is quite simple, since you can use the GVariantBuilder API:
GVariantBuilder builder; g_variant_builder_init (&builder, G_VARIANT_TYPE("a{sv}")); g_variant_builder_add (&builder, "{sv}", "name1", my_variant);