Selected Pricebook is stored in
I've quickly hacked a test and it works in my Dev. Edition so yo should be able to write a
before insert, before update trigger?
List<Opportunity> opps = [SELECT Id, Name FROM Opportunity WHERE Id = '0067000000U5Wtc'];
opps.Pricebook2Id = '01s700000006j5TAAQ';
The field is not listed in the setup but you can cheat by hand-crafting the url to it ;) No way to set lookup filters (hmm, maybe from Eclipse) but a validation rule - why not ;)
Last but not least - have you seen http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_erd_products.htm?