If you pass all the information to the view you could also do it in volt. I dont think its an easier approach though.
Are you generating all fields manually? If you pass it as an array/object you can loop through it in volt en just build the selectbox completly from the ground up. You would still get the correct post/get values from the form.
What kind of approach are you using all together? I take it you are not working with models/form objects then?
To build the selectbox manually in volt it could look similar to this.
<select>
{% for optgroup in yourPassedObject %}
<optgroup label="{{ optgroup.name }}">
{% for option in optgroup.options %}
<option value="{{ option.name }}">{{ ucfirst(option.name) }}</option> # to use ucfirst, see below
{% endfor %}
</optgroup>
{% endfor %}
</select>
# in your service definition for the view add after; $volt = new VoltEngine($view, $this);
$compiler = $volt->getCompiler();
$compiler->addFunction('ucfirst', 'ucfirst');