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)))))