A repeating group is a list of rows, each with its own sub-fields - line items, options, passengers, anything with no fixed count. Add one as a repeating-group field in the Form Editor; its config sheet has its own "Child Fields" section for configuring the sub-fields, recursively, the same way as any other field.

At fill-out time it renders as an "Add row" list, each row with its own Remove. In the submitted data it's a list of objects, one per row, keyed by each sub-field's id:

{ "options": [
  { "description": "Extended Warranty", "price": 500 },
  { "description": "Paint Protection", "price": 250 }
] }

The raw shape in form.json (only needed for anything the config sheet doesn't expose yet):

{
  "id": "options", "type": "repeating-group", "label": "Options",
  "fields": [
    { "id": "description", "type": "text", "label": "Description" },
    { "id": "price", "type": "currency", "label": "Price", "min": 0 }
  ]
}

fields is a normal field-definition array, same shape as top-level fields - one level deep only, no nested repeating groups.

Turning a submitted repeating group into a table on the page is its own topic: Grid.