Provide boolean from two arguments case insensitives

Here's a hopefully complete solution also to the indexing problems. The assumption is that in the species' names you have only plain ASCII characters.

\documentclass[11pt]{article}
\usepackage{makeidx}
\usepackage{biocon}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
\makeindex

% Provide \genus{Generic name}
\newcommand\genus[1]{%
  \lowercase{\ifcsname genus@#1\endcsname}\else
    \definnergenus#1\relax
  \fi
  \lowercase{\csname genus@#1\endcsname}%
}
\def\definnergenus#1#2\relax{%
  \def\tempinitial{#1}%
  \lowercase{\def\tempsecond{#2}\def\tempname{#1#2}}%
  \begingroup\edef\x{\endgroup
    \gdef\unexpanded\expandafter{\csname genus@\tempname\endcsname}{%
      \noexpand\emph{\tempinitial\tempsecond}%
      \noexpand\index{\tempname@{\noexpand\em\tempinitial\tempsecond}|textbf}%
    }%
  }\x}

% Provide \species{Generic name}{specific name}
\newcommand\species[2]{%
  \lowercase{\ifcsname species@#1#2\endcsname\else}%
    \definnerspecies#1\relax{#2}%
  \fi
  \lowercase{\csname species@#1#2\endcsname}%
  \lowercase{\csname speciesindex@#1#2\endcsname}%
}
\def\definnerspecies#1#2\relax#3{%
  \uppercase{\def\tempinitial{#1}}%
  \lowercase{\def\tempfirst{#1}\def\tempsecond{#2}\def\tempthird{#3}}%
  \edef\tempname{\tempfirst\tempsecond\tempthird}%
  \begingroup\edef\x{\endgroup
    \gdef\unexpanded\expandafter{\csname species@\tempname\endcsname}{%
      \noexpand\emph{\tempinitial\tempsecond\space\tempthird}%
      \gdef\unexpanded\expandafter{\csname species@\tempname\endcsname}{%
        \noexpand\emph{\tempinitial.\ \tempthird}}}}\x
  \begingroup\edef\x{\endgroup
    \gdef\unexpanded\expandafter{\csname speciesindex@\tempname\endcsname}{%
      \noexpand\index{%
        \tempfirst\tempsecond@{\noexpand\em\tempinitial\tempsecond}!%
        \tempthird@{\noexpand\em\tempthird}}%
    }}\x}

\begin{document}

\noindent Desired ouput of some \genus{Homo} species:\\
\\
\species{Homo}{erectus} \texttt{(full name 1st time, OK)}\\
\\
\species{Homo}{erectus} \texttt{(abbreviation 2nd time, OK)}\\
\species{Homo}{sapiens} \texttt{(indexed as Homo!sapiens, OK)}\\
\species{Homo}{erectus} \\ 
\species{Homo}{sapiens} \texttt{(indexed as as Homo!sapiens too, OK)}

\noindent Testing in tabular environment:\\
\begin{tabular}{|l|l|}
\hline\species{Homo}{habilis} & \\
\hline\species{Homo}{habilis} & \texttt{(works also inside tabular)}\\\hline
\end{tabular}

\noindent\species{Homo}{habilis} method (try again):

\noindent Testing case correction:\\ 
\verb|\species{Homo}{Antecessor}|: \species{Homo}{Antecessor}\\ 
\verb|\species{Homo}{antecessor}|: \species{Homo}{antecessor}\\
\verb|\species{HOMO}{ANTECEsSOR}|: \species{HOMO}{ANTECEsSOR}

\printindex
\end{document}

Every \species command defines two commands: for instance

\species{Homo}{erectus}

defines

\species@homoerectus
\speciesindex@homoerectus

The first one expands to Homo erectus and globally redefines itself to expand to H. erectus. The input is normalized so that only lowercase letters are used, with the exception of the first initial. The second command deals with the index.

If \speciec@homoerectus is undefined (at the first appearance of \species{Homo}{erectus}, the \definespecies command is called that globally defines the two commands above.

Similarly, \genus{Homo} defines, at its first call, an inner macro with normalized input \genus@homo, that takes care of printing the name and issuing the indexing command.

Here are the pictures.

enter image description here

enter image description here