This sounds like a potential candidate for InfoPath. Blush first, he will do most / everything that you ask.
This article provides a brief overview of creating an InfoPath form based on an SQL data source.
http://office.microsoft.com/en-us/infopath-help/design-a-form-template-based-on-a-microsoft-sql-server-database-HP010086639.aspx
I created a fully customizable solution, as you describe, and if I ever did it again, I would choose either 1) a third-party product, or 2) less functionality. You can spend 90% of your time on a 10% feature set.
EDIT: re-read your questions and here is some additional feedback.
1 - Flexible data structure:. A few things to keep in mind are performance and the ability to write reports against data. The more general the data structure, the more difficult it will be to achieve (again, based on experience).
Unlike performance and report availability, Microsoft SharePoint uses XML fragments / documents in shared tables for maximum flexibility. I can not argue with the features of SharePoint, so it does the job and greatly simplifies the data structure. XML will work well when done correctly, but it will be more difficult for most people to write queries against XML. Although XML is a “first-class citizen” for SQL Server, it may or may not work just like an optimized table structure.
2 - Forms: I implemented custom forms using XML transformed by XSLT. XML is often a good choice for storing form structures; XSLT is a monster for itself, but very powerful. For what it's worth, InfoPath retains its form structure as XML.
I also implemented dynamic forms using custom controls in .Net. This is a very object-oriented approach, but (depending on the complexity of the user interface) a significant amount of code may be required.
Finally (again, using SharePoint as an example), Microsoft implemented horribly complex XML list / form definitions in SharePoint 2007. Complexity loses to many advantages. In other words, if you are following the XML route, make your structures clean and simple, or you will have a maintenance nightmare at your fingertips.
EDIT # 2: Regarding Scott's next question, here is a high-level data structure that avoids data duplication and does not rely on XML for most of the form definition.
Caution: I just put this project into SQL Management Studio ... I spent only 10 minutes on it; the development of a flexible system of forms is not a trivial task, therefore this is an oversimplification. It does not take into account the storage of user input, just a form definition.

Tables:
Form is a top-level form table that contains (as you might have guessed) a collection of fields that make up the form.
Field - general fields that can be reused in different forms. For example, you do not need 50 different Last Name fields for 50 different forms. Pay attention to the column "DataTypeId". You can store any type that you need in this column, for example, "number", "free text", even a value indicating what the user should select from the list.
FormField - allows a form to contain 0-many fields in its definition. You can even expand this table by indicating that the user can add as many fields as they need.
Constraint is basically a lookup table that defines the type of constraint (possibly the maximum length, maximum occurrences required, etc.)
FormFieldConstraint - Binds a constraint to a specific instance of a form field. This table combines a specific form with a specific field with a specific restriction. Note the metadata column; this could potentially make good use of XML to store constraint specifications.
In essence, I propose creating a normalized database with or without zero null values and without duplicate data. The structure, as I described, will lead you to the path to this goal.