Generating SQL with SQL
You should be GRANT-ing to a ROLE, not the individuals.
One exception to this:  one Schema is creating code that reference another schema's table.

Grant to Multiples schemas/roles at once

This is legitimate code:
GRANT INSERT ON SCOTT.EMP TO ADAMS,ALLEN;

If you are on 11g or higher, you can use LISTAGG() to generate the comma separated list

declare
  local_variable  varchar2(2000);
begin
  select listagg( e.ename,',' ) within group (order by e.empno)
    into local_variable
  from scott.emp e
  where e.ename like 'A%';
end;
/


But, you'll need to limit the number of rows.  LISTAGG will error if it is over a certain length (eg 4000 bytes for 11g)

LOOPing

You'll want to LOOP over your table:

begin
  for curr in ( select e.ename from scott.emp e order by e.ename)
  loop
    dbms_output.put_line( 'grant for ' || curr.ename );
  end loop;
end;
/


Master's Technique

OK, ok.  This is my technique.  (maybe others)

Use one of the many freely available template based code generators.
This is probably only useful if you are going to do this on a repetitive cycle as new tables are created.

Again, you should be granting to a ROLE, not individual users.