Thanks so much for your reply!
Your suggestion to use:
client.LowLevel.Indices.PutTemplateForAll<PutIndexTemplateResponse>("product_template", json);
seems a lot better, to be honest I couldn't find any reference to this method in the .NET client after version 1.x, maybe the docs could be updated to make it more clear?
Regarding the pattern matching issue, I don't think the order would solve it because it would still be applied to all indices, and that causes a fatal error when spinning up Kibana because the index mappings for the metrics/logs indices are misconfigured.
I'll follow @warkolm's advice here and open a feature request for a "not match" index pattern matching.