My opinion on this is that validation should be (relatively) orthagonal to the specific layer you're working with - it crosscuts across all layers, as Marcus suggested.
Thus, validation should be wrapped into a separate set of functionality that can be referenced at whichever layer you want. In my "spare" time I'm working on developing validation as a set of rules that can be applied to a) a field, b) an entity, and c) a process. As each of these items are nested under the next, calling a validate method at a higher level, say at the process level, results in all validations to fire for all entities and fields underneath encapsulated by it.
In the GUI, due to this orthagonality one can use AOP or simply attributes to associate a rule with a given control. Then, when the control's Validate event fires, you can trap the event and validate the contro's value against the rule specified in the attribute - and this rule is the same rule used when "Save" is clicked, or when the BL wraps the data for persistence. Consistency, reusability; it's all good.
In early attempts I was able to successfully hook GUI controls to rules using attributes, and associate an ErrorProvider control to provide for visual cueing to the user - as the user tabbed off a field, the rule was checked, and if it failed, a little red icon lit up next to the control with a tooltip describing the violation. So, I'm fairly comfortable that the concept will work when completed.
There are also some validation frameworks out there. I didn't like what I saw as many of them depended too heavily on XML files for the rule sets, but you may find them interesting...
Jeff...