Yes it requires an event enabled PIO. Here is a code snippet:
CONST
kWidgetGroupMode = 81;
kWidgetSeparator = 100;
kWidgetGroupAutomatic = 2;
VAR
gb1 : BOOLEAN;
gb1 := SetObjPropCharVS(kWidgetGroupMode, Chr(kWidgetGroupAutomatic));
gb1 := vsoAddWidget( 1, kWidgetSeparator, 'MY FIRST GROUP' );
gb2 := vsoAddParamWidget(2, 'ParamName1', 'Actual Param Name 1 to Display in OIP');
gb2 := vsoAddParamWidget(3, 'ParamName2', 'Actual Param Name 2 to Display in OIP');
gb2 := vsoAddParamWidget(4, 'ParamName3', 'Actual Param Name 4 to Display in OIP');
gb1 := vsoAddWidget( 5, kWidgetSeparator, 'MY SECOND GROUP' );
gb2 := vsoAddParamWidget(6, 'ParamName4', 'Actual Param Name 4 to Display in OIP');
gb2 := vsoAddParamWidget(7, 'ParamName5', 'Actual Param Name 5 to Display in OIP');
gb2 := vsoAddParamWidget(8, 'ParamName6', 'Actual Param Name 6 to Display in OIP');
Additionally you could add vsoWidgetSetIndLvl(8, x ); if you wanted to further indent one of the parameters, where X = 1 or 2 or 3 being how far it is indented.