Let me be the one that gives you the definitive answer: yes, you can do that, but no, that's not what prepared statements are made for. Once you get how prepared statements work, you can see why this is. When you prepare a statement, that statement is sent to the database, and the database will then store that statement. It will replace all the placeholders with actual values by the time that you call execute( ). Therefore, the table- and fieldnames must be known before the execute call and you can not use placeholders to dynamically insert the table- or fieldnames in a statement that has already been prepared.
Nevertheless, there is no stopping you from doing simple variable substitution: by writing your query like 'SELECT ' . $fieldname . ' FROM ' . $tablename' before preparing the statement, you'll prepare the statement with the tablename and fieldnames already in place, and that's perfectly possible.
You'll have to consider the fact that dynamically inserting the field- and tablenames might be a security risk though: not having security in place might just enable an end-user to view data he's not supposed to. I think your best bet might just be having a whitelist of table- and fieldnames the dynamic query may contain. On the other hand, if you're assembling the query only from inside your application with hard-coded string (no user-input), you should have nothing to worry about.