You don't understand how works cursors and fetch.
Fetch get the data from the cursor, so in your procedure example you get only column names, not the data in the columns. To get data you need another cursor - select from the target table or use the dynamic sql.
This is a code that do what you describe. It is not clear to me how you want to store data from two tables - subsequently or in another manner. Let's assume that we store them subsequently. Also this code suggests than columns with the same names have the same datatypes. Part of this code (to make datatype) I get from another stackoverflow post to save time to write it:
How do I get column datatype in Oracle with PL-SQL with low privileges?
dbms_output.put_line - used to print sql statements that we create
declare
   cSql          varchar2(4000);
   cCols         varchar2(4000);
   cNewTableName varchar2(30) := 'AABBCC';
   cTb1          varchar2(30) := 'TAB1';
   cTb2          varchar2(30) := 'TAB2';
begin 
   for hc in (
           select T.column_name, T.typ
           from
           (
           select column_name,
                  data_type||
                  case when data_precision is not null and nvl(data_scale,0)>0 then '('||data_precision||','||data_scale||')'
                       when data_precision is not null and nvl(data_scale,0)=0 then '('||data_precision||')'
                       when data_precision is null and data_scale is not null then '(*,'||data_scale||')'
                       when char_length>0 then '('||char_length|| case char_used 
                                                                  when 'B' then ' Byte'
                                                                  when 'C' then ' Char'
                                                                  else null 
                                                                  end||')'
                  end||decode(nullable, 'N', ' NOT NULL')  typ
        from all_tab_cols 
       where table_name in (cTb1, cTb2) ) T
             group by T.column_name, T.typ having count(*) > 1)
   loop
      cSql := cSql || case when cSql is null then null else ',' end || hc.column_name || ' ' || hc.typ;
      cCols := cCols || case when cCols is null then null else ',' end || hc.column_name;
   end loop;
   if (cSql is not null) then
      -- First drop table if it exists
      for hc in (select * from all_objects where object_type = 'TABLE' and object_name = cNewTableName)
      loop
         execute immediate 'drop table ' || hc.object_name;
      end loop;
      -- create table
      cSql := 'create table ' || cNewTableName || '(' || cSql || ')';
      dbms_output.put_line(cSql);
      execute immediate cSql;
      -- insert data
      cSql := 'insert into ' || cNewTableName || '(' || cCols || ') select ' || cCols || ' from ' || cTb1;
      dbms_output.put_line(cSql);
      execute immediate cSql;
      cSql := 'insert into ' || cNewTableName || '(' || cCols || ') select ' || cCols || ' from ' || cTb2;
      dbms_output.put_line (cSql);
      execute immediate cSql;
   end if;
end;