https://jsfiddle.net/x75zLn2a/
вот вам каркас. Стилизуйте и напичкайте данными.
Стилизоваться оно должно как угодно, ибо там обычные дивы.
Инпут скрытый я добавил для того, чтобы не колдовать с отправкой из формы - все по фен-шую, стандартный инпут с name и value.
Нейм у инпута - это нейм предполагаемого селекта, data-value у дивов - value у option.
Все свистелки вставляются в div.opt
Еще завтыкал сделать сворачивание при выборе и при клике вне селекта.
И нужно еще добавить позиционирование/размеры, чтобы при открытии оно накрывало то, что снизу, а не сдвигало.
Я думаю, понятно, что и как. Если нет, обращайтесь, подскажу.
upd:
https://jsfiddle.net/zombotron/gakqoz2t/3/
Добавил, что забыл + управление кнопками клавиатуры.
Конечно жестко велосипедно, зато без кучи зависимостей, что позволяет довольно шустренько работать на слабом ноуте.
+ есть небольшие костыли. Но я не претендую на универсальность решения. Это скорее просто алгоритм.