You can render the form you want in any technology and use the TaskService.complete(id, variablesExtractedFromForm) method, passing in the values form the form as variables.
If you want a mechanism to decide at design-time (bpmn20.xml), what form should be shown at runtime, you can use the activiti:formKey attribute (see user guide). This way, you can connect an ID that points to a form in your UI to a task. When getting the task, you can check what form-key it has an render the right form in your UI.