The main idea is that you have to treat the formGroup and formControls as variables, mainly javascript objects and arrays.

So I'll put some code in to make my point. The code below is somewhat like what you have. The form is constructed dynamically, just that it is split into sections, each section containing its share of fields and labels.

The HTML is backed up by typescript classes.

Treat each piece of code as its own file.

 <form (ngSubmit)="onSubmit()" #ciRegisterForm="ngForm" [formGroup]="formSchemaUI.MainFormGroup">
 	<button kendoButton (click)="onSubmit(ciRegisterForm)" [disabled]="!canSubmit()"> Register {{registerPageName}} </button>
 	<br /><br />
 	<app-ci-register-section *ngFor="let sectionUI of formSchemaUI.SectionsUI" [sectionUI]="sectionUI">
 	</app-ci-register-section>
 	<button kendoButton (click)="onSubmit(ciRegisterForm)" [disabled]="!canSubmit()"> Register {{registerPageName}} </button>
 </form>

=============================================

 <div class="row" [formGroup]="sectionUI.MainFormGroup">
 <div class="col-md-12 col-lg-12" [formGroupName]="sectionUI.SectionDisplayId">
 <fieldset class="section-border">
 <legend class="section-border">{{sectionUI.Title}}</legend>
 <ng-container *ngFor='let fieldUI of sectionUI.FieldsUI; let i=index; let even = even;'>
 <div class="row" *ngIf="even">
 <ng-container>
 <div class="col-md-6 col-lg-6" app-ci-field-label-tuple [fieldUI]="fieldUI">
 
 </div>
 </ng-container>
 <ng-container *ngIf="sectionUI.Fields[i+1]">
 <div class="col-md-6 col-lg-6" app-ci-field-label-tuple [fieldUI]="sectionUI.FieldsUI[i+1]">
 
 </div>
 </ng-container>
 </div>
 </ng-container> 
 </fieldset>
 </div>
 </div>

=============================================

<ng-container>
 <div class="row">
 <div class="col-md-4 col-lg-4 text-right">
 <label for="{{fieldUI.FieldDisplayId}}">{{fieldUI.Label}} </label>
 </div>
	 <div class="col-md-8 col-lg-8">
		 <div app-ci-field-edit [fieldUI]="fieldUI" ></div>
	 </div>
 </div> 
</ng-container>

=============================================

 <ng-container>
 <div class="row">
 <div class="col-md-4 col-lg-4 text-right">
 <label for="{{fieldUI.FieldDisplayId}}"> {{fieldUI.Label}} </label>
 </div>
 	 <div class="col-md-8 col-lg-8">
 		 <div app-ci-field-edit [fieldUI]="fieldUI" ></div>
 	 </div>
 </div> 
 </ng-container>

=============================================

 export class FormSchemaUI extends FormSchema { 
 
 SectionsUI: Array<FormSectionUI>;
 MainFormGroup: FormGroup;
 
 static fromFormSchemaData(formSchema: FormSchema): FormSchemaUI {
 let formSchemaUI = new FormSchemaUI(formSchema);
 formSchemaUI.SectionsUI = new Array<FormSectionUI>();
 formSchemaUI.Sections.forEach(section => {
 let formSectionUI = FormSectionUI.fromFormSectionData(section);
 
 formSchemaUI.SectionsUI.push(formSectionUI);
 });
 formSchemaUI.MainFormGroup = FormSchemaUI.buildMainFormGroup(formSchemaUI); 
 return formSchemaUI;
 }
 
 static buildMainFormGroup(formSchemaUI: FormSchemaUI): FormGroup {
 let obj = {};
 formSchemaUI.SectionsUI.forEach(sectionUI => {
 obj[sectionUI.SectionDisplayId] = sectionUI.SectionFormGroup;
 });
 let sectionFormGroup = new FormGroup(obj);
 return sectionFormGroup;
 }
 }

=============================================

 export class FormFieldUI extends FormField { 
 
 public FieldDisplayId: string;
 
 public FieldFormControl: FormControl;
 public ParentSectionFormGroup: FormGroup;
 public MainFormGroup: FormGroup;
 public ParentFormSectionUI: FormSectionUI;
 
 public ListItems: Array<SelectListItem>;
 
 public SelectedItem: SelectListItem;
 
 public SelectedItemsArray: Array<SelectListItem>;
 
 public IsChecked: boolean = false;
 
 public DateValue: Date = undefined; 
 
 public ValueChange: EventEmitter<any> = new EventEmitter<any>(); 
 
 static buildFormControl(formFieldUI:FormFieldUI): FormControl {
 let nullValidator = Validators.nullValidator;
 
 let fieldKey: string = formFieldUI.FieldDisplayId; 
 let fieldValue: any;
 switch (formFieldUI.ColumnType) { 
 default:
 fieldValue = formFieldUI.Value;
 break;
 }
 let isDisabled = !formFieldUI.IsEnabled;
 let validatorsArray: ValidatorFn[] = new Array<ValidatorFn>();
 let asyncValidatorsArray: AsyncValidatorFn[] = new Array<AsyncValidatorFn>();
 
 let formControl = new FormControl({ value: fieldValue, disabled: isDisabled }, validatorsArray, asyncValidatorsArray);
 return formControl;
 }
 }

=============================================

=============================================

=============================================