I've got a Drupal 7 module for incorporating links to related content within another node, based on matching taxonomy terms attached to the other node. I originally implemented it with hook_form_alter and hook_node_submit. Since the latter has been removed from D8, I'm doing what I should have done originally and adding the related content tag sets in as a field. So far, so good. The basics are working fine. The field has three data points in it: the name to be displayed with the grouping, the minimal set of tags that must be matched for the related content to appear, and a checkbox indicating whether that particular grouping should be collapsed or not.

What I'm looking to do, however, is when the cardinality for the field is set to unlimited, have the labels and description of the form items appear in the table header, rather than with each individual row. I can easily clean up the individual form widgets to line up in a row via css, but looking at template_preprocess_field_multiple_value_form(), the header appears to be fixed in how it is rendered:

    $header = array(
      array(
        'data' => array(
          '#prefix' => '<h4' . $header_attributes . '>',
          'title' => array(
            '#markup' => $element['#title'],
          ),
          '#suffix' => '</h4>',
        ),
        'colspan' => 2,
        'class' => array('field-label'),
      ),
      t('Order', array(), array('context' => 'Sort order')),
    );

My Widget class is as follows:

/**
 * Plugin implementation of the 'related_content_default' widget.
 *
 * @FieldWidget(
 *   id = "related_content_default",
 *   label = @Translation("Related Content - Widget"),
 *   description = @Translation("Related Content - Widget"),
 *   field_types = {
 *     "related_content",
 *   }
 * )
 *   multiple_values = TRUE,
 * )
 */

class RelatedContentWidget extends WidgetBase {
  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element['display_name'] = array(
      '#type' => 'textfield',
      '#title' => t('Display Name'),
      '#description' => 'The name displayed for content matching these tags.',
    );

    $element['tags'] = array(
      '#type' => 'textfield',
      '#description' => 'Content matching all of these tags will be related to this hunt.',
      '#title' => t('Tags'),
      '#autocomplete_path' => '/taxonomy/autocomplete/field_data',
    );

    $element['collapsed'] = array(
      '#type' => 'checkbox',
      '#title' => t('Collapsed'),
      '#description' => 'Display the related content as collapsed by default.',
      '#suffix' => '<div style="clear:both;" />',
    );

    if (isset($element['#attached']['library'])) {
      $library = $element['#attached']['library'];
    } else {
      $library = array();
    }
    $library[] = 'related_content/related_content';
    $element['#attached']['library'] = $library;


    return $element;
  }
}

I'm not quite certain how to go about overriding the setup, or if it is even possible. Any assistance would be greatly appreciated!