Not leaving the runner plugged in

I have inherited a CI/CD setup that someone else developed. It consists of a locked runner corresponding to a VM running MS Windows on Azure. So, we use it to build/deploy an ASP.NET application, perhaps once every 5 months. Seems so wasteful to keep that VM running doing nothing most of the time. My coworker says at $18/month it is not worth the effort to try to fix. Maybe so, but the optimizer in me is still troubled.

So, I see one can pause a runner in GL. I assume that all that accomplishes is to block jobs being sent to the runner. I see that GL regularly checks in with the server. If I shut down the server, does GL mark it broken and refuse to use it in the future? Is there any way to automate shutdown/startup? Like an Azure Cloud Function that stops/starts it which can be hit at a HTTPS URL and have GL access that URL when it wants to run a CI/CD job?

Of course, the obvious solution that I am sure many will suggest is to use a shared runner. So, to convert to that, I would need lots more info on what is available/installed on a shared Windows runner. Paths. I could drop some executables we need (nuget, curl) in our repo, I suppose. But then there is the version of msbuild and msdeploy to worry about and their paths. Is there anywhere this information is documented? I would find it much more efficient to migrate to a shared server if I didn’t have to reverse engineer that info or install everything I needed.