I think most every element (there are a few small exceptions) has something you can define. The entire form is wrapped in the ID wpmem_login or wpmem_reg, depending on the form.
For things that you might need to add to, there are some filters for the form that you can use. The entire string of generated html for the login form and the registration form are each passed through a filter, so you can slip in wrappers that way. See this page of the User Guide for a list of all filter and action hooks: https://rocketgeek.com/plugins/wp-members/users-guide/filter-hooks/ The wpmem_register_form filter allows you to filter the html string generated for the form before it is sent to the browser.
You are correct in not changing core files. That is a very bad practice. That is why the filter hooks are there – so you can customize almost every element of the plugin in a way that doesn’t limit your ability to update the plugin. Think of it as building plugins for the plugin.
Between custom stylesheets and filtering the forms, you can bend and shape things pretty extensively using the framework. But I’ll let you in on some inside info: it will be even more flexible in the upcoming versions.
The 2.9 project is going to rebuild the way the forms are constructed. This is going to add some new feature elements, but will also open the door to some additional flexibility in the framework with the way forms can be manipulated. This will pave the way for 3.0.
Essentially, there will be more action hooks and filter hooks during the process of building the form. Currently there are a couple, but they are mainly for text strings like headings and such. Additional hooks during the form build will allow hooking into the process so that if you want to do things very precise, it will be an easier way of doing it rather than filtering the entire form after it is built.