There are a couple of options. I would not create a permanent index.org file, because it would take some extra effort to keep it up to to date. If you don't mind installing f.el and helm, here is a dynamic way to get a list of all the headings.
(defun org-toc () "Generate a table of contents for org-files in this directory." (interactive) (let ((org-agenda-files (f-entries "." (lambda (f) (f-ext? f "org")) t))) (helm-org-agenda-files-headings)))
If you really want a buffer with headlines, you could try this approach to make a temporary buffer with links to the headlines:
(defun org-toc () (interactive) (let ((headings (delq nil (loop for f in (f-entries "." (lambda (f) (f-ext? f "org")) t) append (with-current-buffer (find-file-noselect f) (org-map-entries (lambda () (when (> 2 (car (org-heading-components))) (cons f (nth 4 (org-heading-components))))))))))) (switch-to-buffer (get-buffer-create "*toc*")) (erase-buffer) (org-mode) (loop for (file . heading) in headings do (insert (format "* [[%s::*%s]]\n" file heading)))))