What to do if you have 3 versions of same URL, served through same php file.
I would personally use 301 redirect to redirect 2. and 3. to 1.
Despite the above, I would also set up canonical tag as a kind of "catch all" - just in case some other URL misspelling pop up.
example.com/green-Blue-Widgets.html <--- look at small letter for word Green. I don't know how google pulled that out.
Are you on IIS server? They are case insensitive.
There might have been (or still exist) misspelled URL on your site. Or perhaps someone typed in URL in the address bar and Google picked up URL via G. toolbar? Or someone misspelled the URL when linking to it - there are many ways Google can get unwanted URL variant of a page.
example.com/Green-Blue Widgets.html <--- See the space between Blue and Widgets
Thinking about it - perhaps you have a problem with your back end because why would the above URL return the same content as the URL with hyphen between the words? Maybe you are using "fluffy" URL where the page content is obtained based on part of URL and the rest of URL can be anything. In this case you definitely need canonical tag on your site, but on top of this I would also catch as many unwanted URL variants as I can and 301 redirect them to the proper version. </added>