This is not a private temp table issue, but a compilation issue. To compile PLSQL, the objects need to already exist. If you want to create a PTT dynamically, then you need to query it dynamically as well
SQL> declare
2 v int;
3 begin
4 execute immediate 'create table blah (x int)';
5 select count(*) into v from blah;
6 end;
7 /
select count(*) into v from blah;
*
ERROR at line 5:
ORA-06550: line 5, column 36:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 5, column 8:
PL/SQL: SQL Statement ignored
SQL>
SQL> declare
2 v int;
3 begin
4 execute immediate 'create table blah (x int)';
5 execute immediate 'select count(*) from blah' into v;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL>
SQL>