Normally we can build a form quite straightforward by h:panelGrid oder p:panelGrid if the count of rows / columns, positions of elements, etc. are known.
That's true for static forms. But it's not possible to use h:panelGrid oder p:panelGrid if a form is described dynamically, at runtime.
E.g. if the entire form's definition is placed in a database or a XML file.
DynaForm makes possible to build a dynamic form with labels, inputs, selects and any other elements by model. There aren't limitations.
Other enhancements are expandable extended view area (grid), open / close state saving, autoSubmit feature, widget's client-side API, various facets.
See use cases for more information.