Sure. The basis of the form generation is the fieldset object, you can use its methods to manually build a form by adding fields to it.
If you want to automate it using another source of field information, look at what Observer_Validation::set_fields() does. Just don't ask me why it is there (= in that class)... ;-)
Okay. I knew about building forms via the Fieldset class. I'm looking for a way to do it where it essentially just has one big array set up similar to a model's properties array and pass it in to a function that generates the fieldset with all fields as specified in through the array.
So there's no ready made solution for this it then. Since Observer_Validation::set_fields() seems to only work if you pass it a model from my tests so far, I'll need to create a function that takes in an array and builds it like I want.
Yes, there isn't something ready made, as it depends very much on how that array would be structured, and what it contains, which is application specific.
But you can use set_fields() as a guidance, to see how it is done.