The intervals for MySQL grants comes with different levels.
You simply extract the grants from the mysql schema.
Problem is: From which level do you need the extraction ???
You will need the following query to show you global, database, and table grants
SELECT
IF(table_name='user','Global',IF(table_name='db','Database','Table')) grant_level,
REPLACE(LEFT(column_name,LENGTH(column_name) - 5),'_',' ') grant_type
FROM (SELECT table_name,column_name FROM information_schema.columns
WHERE table_schema='mysql' AND table_name IN ('user','db','tables_priv')
AND column_name LIKE '%\_priv') AAA
ORDER BY table_name='user' DESC,table_name,column_name;
For MySQL 5.7.12, you will see this:
mysql> SELECT
-> IF(table_name='user','Global',IF(table_name='db','Database','Table')) priv_level,
-> REPLACE(LEFT(column_name,LENGTH(column_name) - 5),'_',' ') priv_type
-> FROM (SELECT table_name,column_name FROM information_schema.columns
-> WHERE table_schema='mysql' AND table_name IN ('user','db','tables_priv')
-> AND column_name LIKE '%\_priv') AAA
-> ORDER BY table_name='user' DESC,table_name,column_name;
+------------+-------------------+
| priv_level | priv_type |
+------------+-------------------+
| Global | Alter |
| Global | Alter routine |
| Global | Create |
| Global | Create routine |
| Global | Create tablespace |
| Global | Create tmp table |
| Global | Create user |
| Global | Create view |
| Global | Delete |
| Global | Drop |
| Global | Event |
| Global | Execute |
| Global | File |
| Global | Grant |
| Global | Index |
| Global | Insert |
| Global | Lock tables |
| Global | Process |
| Global | References |
| Global | Reload |
| Global | Repl client |
| Global | Repl slave |
| Global | Select |
| Global | Show db |
| Global | Show view |
| Global | Shutdown |
| Global | Super |
| Global | Trigger |
| Global | Update |
| Database | Alter |
| Database | Alter routine |
| Database | Create |
| Database | Create routine |
| Database | Create tmp table |
| Database | Create view |
| Database | Delete |
| Database | Drop |
| Database | Event |
| Database | Execute |
| Database | Grant |
| Database | Index |
| Database | Insert |
| Database | Lock tables |
| Database | References |
| Database | Select |
| Database | Show view |
| Database | Trigger |
| Database | Update |
| Table | Column |
| Table | Table |
+------------+-------------------+
50 rows in set (0.02 sec)
This should give you a good starting point.
You could probably create it as a table with something like this
CREATE TABLE grant_records ENGINE=MyISAM AS
SELECT
IF(table_name='user','Global',IF(table_name='db','Database','Table')) grant_level,
REPLACE(LEFT(column_name,LENGTH(column_name) - 5),'_',' ') grant_type
FROM (SELECT table_name,column_name FROM information_schema.columns
WHERE table_schema='mysql' AND table_name IN ('user','db','tables_priv')
AND column_name LIKE '%\_priv') AAA
ORDER BY table_name='user' DESC,table_name,column_name;