s:decorate renders a span around its content. The reason for this was to get an id that Ajax4JSF can use to re-render the whole decoration.
But I did not really consider how that would affect h:panelGrid.
Raise an issue in JIRA, if you like....
Yes, h:panelGrid looks at it's lays out each of it's children according to columns attribute. Simply, ui:decorate add's all of its children directly to it's parent BUT s:decorate is a component in it's own right, so keeps it's children. There is nothing we can do about this, and keep the span AFAICS.
Anyway, using a panelGrid with s:decorate isn't very useful IMO.
One idea on how this might be fixed - allow s:decorate to take "for" attribute, that would be used to identify the input field, if one is not provided within the tag body. That way, users can decorate the label without the field (most common case in forms, IMO) without losing the ability to AJAXify the thing.