Index patterns in Kibana are confusing on many levels, but you figured it out! I'll try to sum it up.
First, you have to know about "saved objects" - these are pieces of meta information specific to Kibana. They are also stored in Elasticsearch, but they are not an Elasticsearch functionality (they are just regular documents). A visualization is a saved object (storing information like which chart type to use and how to fetch data), a dashboard is a saved object (storing which visualizations to use and the position of their panels), and - that's the weird part - an "index pattern" is a saved object, too.
It stores information like how to format which field and also the actual "pattern" (like
logstash-alert-*) which is used to find the data indices in Elasticsearch. Each saved object has an id itself (it's just the id of the document where it's stored). In older versions of Kibana, the index pattern saved objects used the pattern itself as id (because it's probably unique already, so why not). This caused a bunch of issues, so more recent versions of Kibana don't do that anymore and use an auto-generated id for the index pattern saved object (the pattern itself is stored in the "title" field).
I did try recreating the index pattern but since I did not have any indexes matching that pattern I could not create the index in kibana
True, Kibana requires you to have at least one index matching your pattern to create the saved object. You can always import index pattern saved objects that don't match though.
I could have added the necessary fields to the json that was used to create the index patterns in the first place. (these came with the dashboard set).
In older versions of Kibana that's the case, because the index pattern saved object has another functionality I skipped - it also caches the list of fields from the mappings of the data indices. However, messing with this list manually is brittle because someone could always "refresh" the field list from the UI. In more recent versions of Kibana (starting from 7.11), index patterns don't cache the field list anymore, but always pull this information from the source of truth - the mappings of the data indices.