Existe uma razão pela qual você não usa uma função em vez de um procedimento?
CREATE OR REPLACE FUNCTION ListadoClientes() RETURN sys_refcursor
IS
resul Sys_refcursor;
BEGIN
OPEN resul for select ID ,NOMBRES ,APELLIDOS ,CEDULA ,DIRECCION ,TELEFONO
from cliente;
RETURN resul;
END ListadoClientes;
Então, em C #, você deve alterá-lo para isso:
cmd.Parameters.Add("resul", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
Quando você executa
da.Fill(ds);
então a função é executada, ou seja, usando cmd.ExecuteNonQuery();
executa a função duas vezes. Enfim, para um procedimento o caminho certo deve ser este:
cmd.CommandText = "ListadoClientes(:resul)";