As an addition, when recreating some of the native (or more complex) interactive widgets, I find the WAI-ARIA Authoring Practices a great read.
They offer a list of the expected behaviour (for focus, keyboard etc.), as well as the roles and examples of alternative implementations.
iirc, <select> in this case falls under a "Listbox" pattern
For example, it lists that the ul is the one to receive focus, and that the li items are not tabbable per se, but aria-activedescendant on the ul marks the candidate selection. There different ways to do things, of course, which is why I like documents there. The discussion of those patterns on Github has also taught me much about accessibility :)
Something else that I am reminded of, Scott Jehl from Filament Group had an article a while back about styling the native select element. It has some fun stuff:
(There was a comment below that mentioned all this replacement seeming tedious, but I find it fascinating how much gets exposed to assistive tehcnologies out of the box)
We're a place where coders share, stay up-to-date and grow their careers.
We strive for transparency and don't collect excess data.