Form API Select List will not show empty option
It looks like you're not running your form through drupal_get_form()...that would account for the additional form processing functions not running, but you'll still get a rendered HTML element out at the other end so it could be difficult to tell the difference.

Just change the page callback for your router item, and add the form as arguments:

function stack_test_menu(){
  $items['stacktest'] = array(
    'title' =&gt; 'Stack Test',
    'page callback' =&gt; 'drupal_get_form',
    'page arguments' =&gt; array('stack_test_form'),
    'access callback' =&gt; TRUE,
    'type' =&gt; MENU_NORMAL_ITEM,
    'menu_name' =&gt; 'main-menu',
  );
  return $items;
}


Clear the caches and give your test page another try.

The same goes for your original problem - A form is essentially just a render array, and when you return that directly from a page callback it's run through drupal_render(). That function will do what it can to render the form element, and it knows how to do it to a certain degree, but the form processing functions add a lot of extra stuff in there, which drupal_render() won't do.

Moral of the story - always use drupal_get_form() to build the output for a form :)