The best I've come up with so far is a custom module's hook_form_alter to create a fieldset and move fields in. Note that in order to avoid something like:
Notice: Undefined index: field_txt_student_id in ctools_entity_form_field_content_type_render() (line 96 of [...]/sites/all/modules/contrib/ctools/plugins/content_types/form/entity_form_field.inc).
because the field is moved and unset(), it is not known by ctools to have been moved (or something). Its render function does basic data sanity checking but then goes with the assumption that this field still exists by name where it was before the alter.
To get around that, instead of unset()'ing the original field, set it to a non-kind-of-field per this thread.
$form[$fieldname] = array('#language' => NULL);
Would love to hear what other solutions exist! I spilled my "solutions that don't work" in a comment on your original question.