v$fixed_table - list of x$
v$fixed_view_definition - descripiton of v$ views defintions
V$indexed_fixed_column - list of x$ pseudo indexes, see JL's page v$views


For  general v$ and dba view access, the best thing should be
 
        grant SELECT_CATALOG_ROLE
 
Though
 
        grant SELECT ANY DICTIONARY
    
should work as well ( I think the latter might be depricated, though it works in v9, more info http://arjudba.blogspot.com/2008/05/use-select-any-dictionary-or.html)
 
For specific, v$ tables we can grant by using the "v$_" name, ie for v$mystat we would do  
 
        GRANT SELECT ON v_$mystat TO {user/role}; 
 
For x$ tables it's a two step process
 
        create or replace view embt$mystat as select * from sys.x$ksuse;
        grant select on sys.embt$ksuse to {user/role};
 
To recap - I would just do a test select from each table we need access to and if it returns an error, the flag to the user to either
    
       grant SELECT_CATALOG_ROLE
or
        GRANT SELECT ON v_$mystat TO {user/role}; 
 
In case we use x$ views, we should write a setup script, and then tell the user this setup script needs to be run if there are any errors.